home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Education
/
World of Education.iso
/
world_s
/
startrek.zip
/
FIGURES
< prev
next >
Wrap
Text File
|
1989-05-15
|
61KB
|
2,113 lines
fig 4.1 LINE NUMBER ALLOCATION FOR THE PROGRAM
10 Heading, manual overhead
50 Subroutines most commonly used.
200 MAP (COMPUTER) ROUTINE
300 LRS LONG RANGE SENSOR SCAN ROUTINE
400 SRS SHORT RANGE SENSORS
800 PHA PHASERS
1000 TOR PHOTON TORPEDOES
1300 NAV WARP ENGINES/NAVIGATION
1900 COM COMPUTER MAIN ROUTINE
2500 VIS VISUAL
2600 RES RESIGN
2700 SHE SHIELDS
2800 DAM DAMAGE CONTROL
3000 Main (PLAYGAME) Loop
3600 TRA TRANSPORTER
3800 SHU SHUTTLECRAFT
4300 LRP LONG RANGE PROBE LAUNCH
4500 Initialisation Sequence
5000 SAV SAVE THE GAME
5500 LSG LOAD A SAVED GAME
6000 Error Trapping and Recovery Routines
9000 Endgame
10000 Dummy subroutines used during program testing/integration
fig 4.2 OUTLINE FOR THE PROGRAM
10 REM STARTREK VERSION XX-YY-ZZ
200 REM MAP (COMPUTER) ROUTINE
210 GOTO 10000
300 REM LRS LONG RANGE SENSOR SCAN ROUTINE
310 GOTO 10000
400 REM SRS SHORT RANGE SENSORS
410 GOTO 10000
800 REM PHA PHASERS
810 GOTO 10000
1000 REM TOR PHOTON TORPEDOES
1010 GOTO 10000
1300 REM NAV WARP ENGINES/NAVIGATION
1310 GOTO 10000
1900 REM MAIN COMPUTER ROUTINE
1910 GOTO 10000
2500 REM VIS VISUAL
2510 GOTO 10000
2600 REM RES RESIGN
2610 GOTO 10000
2700 REM SHE SHIELDS
2710 GOTO 10000
2800 REM DAM DAMAGE CONTROL
2810 GOTO 10000
3000 REM MAIN LOOP
3600 REM TRA TRANSPORTER
3610 GOTO 10000
3800 REM SHU SHUTTLECRAFT
3810 GOTO 10000
4300 REM LRP LONG RANGE PROBE LAUNCH
4310 GOTO 10000
4500 REM INITIALISATION SEQUENCE
5000 REM SAV SAVE THE GAME
5010 GOTO 10000
5500 REM LSG LOAD A SAVED GAME
5510 GOTO 10000
6000 REM ERROR TRAPPING/RECOVERY
9000 REM ENDGAME
9010 END
10000 REM DUMMY ROUTINES USED DURING PROGRAM TESTING/INTEGRATION
10001 PRINT "FUNCTION NOT PROGRAMMED AT THIS TIME" : RETURN
fig 4.3 FLOWCHART FOR INITIALISING THE VARIABLES
: INITIALISE.VARIABLES
DISPLAY STARTING MESSAGES
SET.UP.CONSTANTS.PARAMETERS.&.VARIABLES (4500)
ZERO.ALL.FLAGS (4660)
LOOP (number of rows) (4670)
+ LOOP (number of colums in each row)
+ + COMPUTE.NUMBER.OF.STARS (4790)
+ + STARBASE.PRESENT =? (4800)
+ + YES (1) SUM.TOTAL.OF.STARBASES
+ + THEN (1)
+ + COMPUTE.NUMBER.OF.KLINGONS (4810)
+ + SUM.TOTAL.OF.KLINGONS
+ LOOPEND
LOOPEND
LOOP ( until number of Klingons sufficient) (4710)
+ COMPUTE.RANDOM.QUADRANT.IN.GALAXY
+ CONTAINS.KLINGONS.OR.STARBASE =?
+ NO (2) COMPUTE.NUMBER.OF.STARS
+ COMPUTE.NUMBER.OF.KLINGONS
+ SUM.TOTAL.OF.KLINGONS
+ COMPUTE.IF.STARBASE.PRESENT.IN.QUADRANT
+ STARBASE.PRESENT =?
+ YES (3) SUM.TOTAL.OF.STARBASES
+ THEN (3)
+ THEN (2)
LOOPEND
IS.NUMBER.OF.KLINGONS.MORE.THAN.30 =?
YES (4) SET.TOTAL.TIME.=.NUMBER.OF.KLINGONS (4740)
NO (4) SET.TOTAL.TIME.=.30
THEN (4)
SET.INITIAL.TIME.PARAMETER (4750)
SUM.OF.STARBASES.0 =?
YES (5) COMPUTE.RANDOM.QUADRANT.INSIDE.THE.GALAXY
PUT.STARBASE.IN.THAT.QUADRANT
TOTAL.OF.STARBASES.=.1
THEN (5)
COMPUTE.RANDOM.QUADRANT.INSIDE.THE.GALAXY (4760)
POSITION.ENTERPRISE.IN.THAT.QUADRANT
SET.UP.CONTENTS.OF.QUADRANT (4770)
SET.UP.CONDITION ; (4780)
The numbers in parentheses at the end of some lines refer to
the line numbers in the BASIC language implementation of the flow
chart.
FIG4.4 BASIC LANGUAGE IMPLEMENTATION OF INITIALISATION/STARTUP SEQUENCE
10 PRINT CHR$(26) : PRINT " STARTREK VERSION 83-05-28 : ON ERROR GOTO 6000
20 PRINT : PRINT "By Joe Kasser" : PRINT : GOSUB 4500 : GOSUB 4660
30 PRINT : PRINT K9/100;"Klingons have invaded Federation territory" : PRINT
40 PRINT "Your mission is to destroy them in";T;"Stardates" : GOTO 3000
4500 REM INITIALISATION SEQUENCE
4510 Z=1 : S$=".*EKB" : E0=4000 : C1=14 : C2=5
4520 DIM D(C1),D$(C1),Q(7,7),S(7,7),K1(7),K2(7),K3(7),S8(7,7)
4530 PRINT "Welcome to the Starfleet Academy Command Training"
4540 PRINT "Simulator. You are assigned the role of the captain"
4550 PRINT "of the Starship Enterprise."
4560 PRINT : PRINT "For assistance, type HELP or read the manual"
4570 D$(0)="WARP ENGINES " :D$(1)="SHORT RANGE SENSORS " :D$(2)="LONG RANGE SENSORS " :D$(3)="PHASERS "
4580 D$(4)="PHOTON TORPEDOES " :D$(5)="COMPUTER " :D$(6)="SHIELDS " :D$(7)="LONG RANGE PROBES "
4590 D$(8)="TRANSPORTER " :D$(9)="SHUTTLECRAFT " :D$(10)="DAMAGE CONTROL " :D$(11)="VISUAL " :D$(12)="RESIGN"
4600 D$(13)="SAVE THE STATE OF THE GAME" : D$(14)="LOAD A SAVED GAME"
4610 C1$="NAVSRSLRSPHATORCOMSHELRPTRASHUDAMVISRESSAVLSGMAPKSTSCA" : C2$="MAPSTAKSTDIRSCA"
4620 C3$(0)="MAP" : C3$(1)="STAtus (Score)" : C3$(2)="KLINGON STatus"
4630 C3$(3)="DIRECTION/DISTANCE calculator" : C3$(4)="Sector/System SCAn"
4650 RETURN
4660 C9=0 : K4=0 : K5=0 : F9=0 : G9=0 : K9=0 : B9=0 : L3=0 : GOSUB 3550
4670 FOR I=0 TO 7 : FOR J=0 TO 7 : GOSUB 4790 : Q(I,J)=-(K+B+S) : NEXT J : NEXT I
4710 IF K9>2000 THEN 4740
4720 GOSUB 50 : IF Q(X,Y)<-9 THEN 4720
4730 GOSUB 4790 : Q(X,Y)=-(K+B+S) : GOTO 4710
4740 IF K9/100<30 THEN T=30 ELSE T=K9/100
4750 T9=T+Z : IF B9=0 THEN GOSUB 50 : Q(X,Y)=Q(X,Y)-10 : B9=10
4760 GOSUB 50 : Q1=X : Q2=Y : GOSUB 3200 : GOSUB 90 : E1=E0/10 : GOSUB 3400 : RETURN
4790 S=INT(RND(Z)*7+Z)
4800 B=0 : IF RND(Z)<.02 THEN B=10 : B9=B9+B
4810 K=0 : IF RND(Z)<.06 THEN K=INT(RND(Z)*8)*100 : K9=K9+K : K8=K9
4830 RETURN
FIGURE 4.5 SUPPLIMENTARY INITIALISATION SUBROUTINES
50 REM SUBROUTINE TO SET UP 2 RANDOM CO-ORDINATES
60 X=INT(RND(Z)*8) : Y=INT(RND(Z)*8) : RETURN
90 REM SUBROUTINE TO SET UP ENTERPRISE PARAMETERS
100 E=E0 : E1=0 : P=10 : RETURN
3200 REM SUBROUTINE TO SET UP QUADRANT
3340 RETURN
3400 REM SUBROUTINE TO SET UP CONDITION
3540 RETURN
3550 REM SUBROUTINE TO REPAIR ALL SUB-SYSTEMS
3560 FOR I = 0 TO C1-C2 : D(I)=0 : NEXT : RETURN
FIGURE 4.6 FLOWCHART FOR THE PLAY.THE.GAME LOOP
: PLAY.THE.GAME (3000)
LAST.COMMAND.MOVE =? (3020)
SHORT.RANGE.SENSORS.DAMAGED =?
YES (1) PERFORM.A.VISUAL.SCAN
NO (1) PERFORM.A.SHORT.RANGE.SENSOR.SCAN
THEN (1)
PROMPT.FOR.CHOICE (3050)
WAIT.FOR.REPLY
IS.REPLY.<.3.CHARACTERS =?
YES (2) DISPLAY.ERROR.PROMPT
NO (2) IS.COMMAND.VALID =? (3060)
YES (3) PERFORM.IT (3080)
NO (3) DISPLAY.COMMAND.PROMPT
THEN (3)
THEN (2) ;
GAME.OVER.FLAG.SET =? (3090)
NO (4) LAST.COMMAND.SRS/VIS/KST =?
NO (5) KLINGONS.IN.QUADRANT =? (3100)
YES (6) MOVE.KLINGONS
BACKFIRE
THEN (6)
THEN (5)
THEN (4) ;
FIGURE 4.7 BASIC LANGUAGE IMPLEMENTATION OF THE PLAY.THE.GAME LOOP
3000 REM-MAIN LOOP
3020 IF C9=0 THEN I=Z : IF D(Z)=0 THEN GOSUB 400 ELSE I=11 : GOSUB 2500
3040 PRINT
3050 INPUT "COMMAND ";A$ : IF LEN(A$)<3 THEN PRINT "BEG PARDON CAPTAIN (3 letters please) " : GOTO 3050
3060 FOR I=0 TO LEN(C1$)/3-Z : IF A$=MID$(C1$,(I*3)+Z,3) THEN 3080
3070 NEXT : FOR I=0 TO C1 : PRINT MID$(C1$,(I*3)+Z,3); TAB(8);D$(I) : NEXT :
C9=99 : GOTO 3000
3080 C9=I : ON I+Z GOSUB 1300,400,300,800,1000,1900,2700,4300,3600,3800,2800,2500,2600,5000,5500,200,1980,2360
3090 IF F9>0 THEN 9000 ELSE PRINT : IF C9=Z THEN 3110
3100 IF K>0 THEN GOSUB 700 : GOSUB 600 : IF F9>0 THEN 9000
3110 GOTO 3000
600 REM BACKFIRE SUBROUTINE
680 RETURN
700 REM MOVE KLINGON ROUTINE
740 RETURN
FIGURE 4.8 PROGRAM AT END OF CHAPTER 4
10 PRINT CHR$(26) : PRINT " STARTREK VERSION 83-06-12 : ON ERROR GOTO 6000
20 PRINT : PRINT "By Joe Kasser" : PRINT : GOSUB 4500 : GOSUB 4660
30 PRINT : PRINT K9/100;"Klingons have invaded Federation territory" : PRINT
40 PRINT "Your mission is to destroy them in";T;"Stardates" : GOTO 3000
50 REM SUBROUTINE TO SET UP 2 RANDOM CO-ORDINATES
60 X=INT(RND(Z)*8) : Y=INT(RND(Z)*8) : RETURN
90 REM SUBROUTINE TO SET UP ENTERPRISE PARAMETERS
100 E=E0 : E1=0 : P=10 : RETURN
200 REM MAP (COMPUTER) ROUTINE
210 GOTO 10000
300 REM LRS LONG RANGE SENSOR SCAN ROUTINE
310 GOTO 10000
400 REM SRS SHORT RANGE SENSORS
410 GOTO 10000
600 REM BACKFIRE SUBROUTINE
680 RETURN
700 REM MOVE KLINGON ROUTINE
740 RETURN
800 REM PHA PHASERS
810 GOTO 10000
1000 REM TOR PHOTON TORPEDOES
1010 GOTO 10000
1300 REM NAV WARP ENGINES/NAVIGATION
1310 GOTO 10000
1900 REM MAIN COMPUTER ROUTINE
1910 GOTO 10000
2500 REM VIS VISUAL
2510 GOTO 10000
2600 REM RES RESIGN
2610 GOTO 10000
2700 REM SHE SHIELDS
2710 GOTO 10000
2800 REM DAM DAMAGE CONTROL
2810 GOTO 10000
3000 REM MAIN LOOP
3020 IF C9=0 THEN I=Z : IF D(Z)=0 THEN GOSUB 400 ELSE I=11 : GOSUB 2500
3040 PRINT
3050 INPUT "COMMAND ";A$ : IF LEN(A$)<3 THEN PRINT "BEG PARDON CAPTAIN (3 letters please) " : GOTO 3050
3060 FOR I=0 TO LEN(C1$)/3-Z : IF A$=MID$(C1$,(I*3)+Z,3) THEN 3080
3070 NEXT : FOR I=0 TO C1 : PRINT MID$(C1$,(I*3)+Z,3); TAB(8);D$(I) : NEXT : C9=99 : GOTO 3000
3080 C9=I : ON I+Z GOSUB 1300,400,300,800,1000,1900,2700,4300,3600,3800,2800,2500,2600,5000,5500,200,1980,2360
3090 IF F9>0 THEN 9000 ELSE PRINT : IF C9=Z THEN 3110
3100 IF K>0 THEN GOSUB 700 : GOSUB 600 : IF F9>0 THEN 9000
3110 GOTO 3000
3200 REM SUBROUTINE TO SET UP QUADRANT
3340 RETURN
3400 REM SUBROUTINE TO SET UP CONDITION
3540 RETURN
3550 REM SUBROUTINE TO REPAIR ALL SUB-SYSTEMS
3560 FOR I = 0 TO C1-C2 : D(I)=0 : NEXT : RETURN
3600 REM TRA TRANSPORTER
3610 GOTO 10000
3800 REM SHU SHUTTLECRAFT
3810 GOTO 10000
4300 REM LRP LONG RANGE PROBE LAUNCH
4310 GOTO 10000
4500 REM INITIALISATION SEQUENCE
4510 Z=1 : S$=".*EKB" : E0=4000 : C1=14 : C2=5
4520 DIM D(C1),D$(C1),Q(7,7),S(7,7),K1(7),K2(7),K3(7),S8(7,7),C3$(4)
4530 PRINT "Welcome to the Starfleet Academy Command Training"
4540 PRINT "Simulator. You are assigned the role of the captain"
4550 PRINT "of the Starship Enterprise."
4560 PRINT : PRINT "For assistance, type HELP or read the manual"
4570 D$(0)="WARP ENGINES " :D$(1)="SHORT RANGE SENSORS " :D$(2)="LONG RANGE SENSORS " :D$(3)="PHASERS "
4580 D$(4)="PHOTON TORPEDOES " :D$(5)="COMPUTER " :D$(6)="SHIELDS " :D$(7)="LONG RANGE PROBES "
4590 D$(8)="TRANSPORTER " :D$(9)="SHUTTLECRAFT " :D$(10)="DAMAGE CONTROL " :D$(11)="VISUAL " :D$(12)="RESIGN"
4600 D$(13)="SAVE THE STATE OF THE GAME" : D$(14)="LOAD A SAVED GAME"
4610 C1$="NAVSRSLRSPHATORCOMSHELRPTRASHUDAMVISRESSAVLSGMAPKSTSCA" : C2$="MAPSTAKSTDIRSCA"
4620 C3$(0)="MAP" : C3$(1)="STAtus (Score)" : C3$(2)="KLINGON STatus"
4630 C3$(3)="DIRECTION/DISTANCE calculator" : C3$(4)="Sector/System SCAn"
4650 RETURN
4660 C9=0 : K4=0 : K5=0 : F9=0 : G9=0 : K9=0 : B9=0 : L3=0 : GOSUB 3550
4670 FOR I=0 TO 7 : FOR J=0 TO 7 : GOSUB 4790 : Q(I,J)=-(K+B+S) : NEXT J : NEXT I
4710 IF K9>2000 THEN 4740
4720 GOSUB 50 : IF Q(X,Y)<-9 THEN 4720
4730 GOSUB 4790 : Q(X,Y)=-(K+B+S) : GOTO 4710
4740 IF K9/100<30 THEN T=30 ELSE T=K9/100
4750 T9=T+Z : IF B9=0 THEN GOSUB 50 : Q(X,Y)=Q(X,Y)-10 : B9=10
4760 GOSUB 50 : Q1=X : Q2=Y : GOSUB 3200 : GOSUB 90 : E1=E0/10 : GOSUB 3400 : RETURN
4790 S=INT(RND(Z)*7+Z)
4800 B=0 : IF RND(Z)<.02 THEN B=10 : B9=B9+B
4810 K=0 : IF RND(Z)<.06 THEN K=INT(RND(Z)*8)*100 : K9=K9+K : K8=K9
4830 RETURN
5000 REM SAV SAVE THE GAME
5010 GOTO 10000
5500 REM LSG LOAD A SAVED GAME
5510 GOTO 10000
6000 REM ERROR TRAPPING/RECOVERY
9000 REM ENDGAME
9010 END
10000 REM DUMMY ROUTINES USED DURING PROGRAM TESTING/INTEGRATION
10001 PRINT "FUNCTION NOT PROGRAMMED AT THIS TIME" : RETURN
FIGURE 5.1 FLOWCHART FOR THE DAMAGE.CONTROL COMMAND
: DAMAGE.CONTROL (2800)
DISPLAY.HEADING (2810)
ANY.SUBSYSTEM.DAMAGED =? (2820)
YES (1) LOOP (number of sub-systems) (2850)
+ SUB.SYSTEM.DAMAGED =?
+ YES (2) DISPLAY.ESTIMATED.REPAIR.TIME
+ THEN (2)
LOOPEND (2860)
KLINGONS.IN.QUADRANT =? (Battle going on ? )
NO (3) REPAIR.TIME.ALLOCATION.DIALOG (2870)
LOOP (number of sub-systems) (2880)
+ IS.SUB.SYSTEM.DAMAGED =?
+ YES (4) ADJUST.REPAIR.TIME.FOR.SUB-SYSTEM (2890)
+ REPAIR.TIME.=<.0 =?
+ YES (5) SET.IT.TO.0
+ DISPLAY.REPAIRED.STATUS.MESSAGE
+ THEN (5)
+ THEN (4)
LOOPEND (2900)
UPDATE DAYS LEFT
THEN (3)
NO (1) DISPLAY.ALL.OK.MESSAGE
THEN (1) ; (2910)
FIGURE 5.2 BASIC LANGUAGE IMPLEMENTATION OF DAMAGE CONTROL COMMAND
2800 REM DAM DAMAGE CONTROL
2810 GOSUB 70 : D8=0
2820 FOR I=0 TO C1-C2 : IF D(I)>0 THEN D8=D8+Z
2830 NEXT: PRINT : IF D8=0 THEN PRINT : PRINT "ALL SYSTEMS A-OK !": GOTO 2910
2840 PRINT "SYSTEM";TAB(28);"ETR" : PRINT
2850 FOR I=0 TO C1-C2 : IF D(I)>0 THEN PRINT D$(I);TAB(28);INT(D(I)+Z)
2860 NEXT : IF K>0 THEN 2910
2870 PRINT :INPUT "HOW MANY DAYS TO SPEND ON REPAIRS SIR ";D8 : IF D8<0 THEN D8=0
2880 FOR I=0 TO C1-C2 : IF D(I)=0 THEN 2900
2890 D(I)=D(I)-D8 : IF D(I)=<0 THEN D(I)=0 : PRINT D$(I); "REPAIRED"
2900 NEXT : T=T-D8
2910 RETURN
70 REM SUB TO PRINT HEADING
80 PRINT : PRINT D$(I);"AT QUADRANT";Q1+Z;",";Q2+Z : PRINT : RETURN
FIGURE 5.3 FLOWCHART FOR THE MAP COMMAND
: MAP (200)
IS.MAP.DAMAGED =? (210)
YES (1) DISPLAY.DAMAGED.MESSAGE
NO (1) DISPLAY.HEADING (220)
DISPLAY.COLUMN.NUMBERS
LOOP (on rows in galaxy)
+ DISPLAY.ROW.NUMBER
+ LOOP (on columns) (230)
+ IS.ENTERPRISE.IN.QUADRANT =?
+ + YES (2) IS.QUADRANT.SCANNED =?
+ + NO (3) DISPLAY.UNSCANNED.PINPOINT.LOCATION
+ + THEN (3)
+ + THEN (2)
+ + IS.QUADRANT.UNSCANNED =? (240)
+ + YES (4) DISPLAY.BLANK.QUADRANT
+ + NO (4) IS.ENTERPRISE.IN.QUADRANT (250)
+ + YES (5) DISPLAY.SCANNED.PINPOINT.LOCATION
+ + NO (5) DISPLAY.CONTENTS.OF.QUADRANT (260)
+ + THEN (5)
+ + THEN (4) DISPLAY."SPACE"
+ LOOPEND (270)
+ ADVANCE.DISPLAY.TO.NEXT.LINE
LOOPEND
THEN (1) ; (280)
FIGURE 5.4 BASIC LANGUAGE IMPELEMENTATION OF THE MAP SUBROUTINE
200 REM MAP (COMPUTER) ROUTINE
210 I=5 : IF D(I)>0 THEN PRINT "COMPUTER DOWN AT THIS TIME " : GOTO 280
220 GOSUB 70 : FOR I=0 TO 7 : PRINT TAB((Z+I)*5);I+Z; : NEXT : PRINT : FOR I=0 TO 7 : PRINT I+Z ;
230 FOR J=0 TO 7 : PRINT " "; : IF I=Q1 AND J=Q2 AND Q(I,J)<0 THEN PRINT CHR$(8);"+***+"; : GOTO 270
240 IF Q(I,J)<0 THEN PRINT "*** "; : GOTO 270
250 E$=STR$(Q(I,J)) : E$=" 00"+MID$(E$,2) : IF I=Q1 AND J=Q2 THEN PRINT CHR$(8);"+";RIGHT$(E$,3);"+"; : GOTO 270
260 PRINT RIGHT$(E$,3);" ";
270 NEXT J : PRINT : NEXT I
280 RETURN
FIGURE 5.5 FLOWCHART FOR THE LONG RANGE SENSORS COMMAND
: LONG.RANGE.SENSORS (300)
ARE.SENSORS.DAMAGED =? (310)
YES (1) DISPLAY.DAMAGED.MESSAGE
NO (1) DISPLAY.HEADING (320)
LOOP (on rows -/+ position)
+ LOOP (on columns -/+ position in row)
+ + DISPLAY.SPACE.CHARACTER
+ + QUADRANT.IN.GALAXY =? (330)
+ + YES (2) COMPUTER.DAMAGED =? (340)
+ + NO (3) SCAN.QUADRANT
+ + THEN (3)
+ + DISPLAY.CONTENTS.OF.QUADRANT (350)
+ + NO (2) DISPLAY.ZERO.QUADRANT
+ + THEN (2)
+ LOOPEND (360)
+ ADVANCE.DISPLAY.TO.NEXT.LINE
LOOPEND
THEN (1) ;
FIGURE 5.6 BASIC LANGUAGE VERSION OF LONG RANGE SENSORS SUBROUTINE
300 REM LRS LONG RANGE SENSOR SCAN ROUTINE
310 IF D(I)>0 THEN PRINT D$(I); " DAMAGED" : GOTO 370
320 GOSUB 70 : FOR I=Q1-Z TO Q1+Z : FOR J=Q2-Z TO Q2+Z: PRINT " ";
330 IF I<0 OR I>7 OR J<0 OR J>7 THEN PRINT "***" ; : GOTO 360
340 IF D(5)=0 THEN Q(I,J)=ABS(Q(I,J))
350 E$=STR$(Q(I,J)) : E$="00"+MID$(E$,2) : PRINT RIGHT$(E$,3);
360 NEXT J : PRINT : NEXT I
370 RETURN
FIGURE 6.1 FLOWCHART FOR THE SHORT RANGE SENSORS SUBROUTINE
: SHORT.RANGE.SENSORS (400)
ARE.SENSORS.DAMAGED =? (410)
YES (1) DISPLAY.DAMAGED.MESSAGE
NO (1) IS.QUADRANT.INSIDE.THE.GALAXY =?
YES (2) COMPUTER.DAMAGED =? (430)
NO (3) UPDATE.MAP.DATA
THEN (3)
THEN (2)
DISPLAY.HEADING (440)
DETERMINE.CURRENT.CONDITION
DISPLAY.COLUMN.NUMBERS
DISPLAY.CURRENT.SCORE
LOOP (On rows)
+ LOOP (On columns in row) (450)
+ + DISPLAY.CONTENTS.OF SECTOR
+ + DISPLAY."SPACE"
+ LOOPEND
+ DISPLAY.GAME.STATUS.INFORMATION.ITEMS (460)
+ ADVANCE.DISPLAY.TO.NEXT.LINE
LOOPEND (550)
THEN (1) ;
FIGURE 6.2 BASIC LANGUAGE IMPLEMENTATION OF SHORT RANGE SENSOR SUBROUTINE
400 REM SRS SHORT RANGE SENSORS
410 IF D(I)>0 THEN PRINT D$(I); " DAMAGED" : RETURN
420 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN 440
430 IF D(5)=0 THEN Q(Q1,Q2)=ABS(Q(Q1,Q2))
440 GOSUB 70 : GOSUB 3400 : PRINT " 1 2 3 4 5 6 7 8";TAB(20); : GOSUB 170 : FOR I=0 TO 7 : PRINT I+Z ;
450 FOR J=0 TO 7 : PRINT MID$(S$,S(I,J),Z); " ";: NEXT J : PRINT TAB(20) ;
460 ON I+Z GOTO 470,480,490,500,510,520,530,540
470 PRINT "DAYS LEFT"; TAB(38);T : GOTO 550
480 PRINT "CONDITION "; TAB(38);C$ : GOTO 550
490 PRINT "SHIELDS"; TAB(38);E1 : GOTO 550
500 PRINT "ENERGY" ; TAB(38);E : GOTO 550
510 PRINT "PHOTON TORPEDOES";TAB(38);P : GOTO 550
520 PRINT "STARBASES";TAB(38);B9/10 : GOTO 550
530 PRINT "KLINGONS LEFT";TAB(38);K9/100 : GOTO 550
540 PRINT "KLINGONS CAPTURED";TAB(38);K4 : GOTO 550
550 NEXT I : RETURN
170 REM SUBROUTINE TO PRINT SCORE
180 N=INT(((K8-K9)/100)*(K5/2.5+K4+Z)^2*100/(T9-T)) : IF N<0 THEN N=0
190 PRINT "SCORE";TAB(38);N : RETURN
FIGURE 6.3 FLOWCHART FOR THE VISUAL COMMAND
: VISUAL (2500)
DISPLAY.HEADING (2510)
LOOP (+/- 2 rows)
+ LOOP (+/- 2 columns)
+ + SECTOR.INSIDE.QUADRANT =? (2520)
+ + YES (1) DISPLAY.CONTENTS.OF.SECTOR
+ + NO (1) DISPLAY.$.SIGN (Out of Quadrant)
+ + THEN (1)
+ + DISPLAY.SPACE.CHARACTER (2540)
+ LOOPEND
+ ADVANCE.TO.NEXT.LINE
LOOPEND
SET.LAST.COMMAND.FLAG.=.SRS ;
FIGURE 6.4 BASIC LANGUAGE IMPLEMENTATATION OF THE VISUAL SUBROUTINE
2500 REM VIS VISUAL
2510 GOSUB 70 : FOR I=S1-2 TO S1+2 : FOR J=S2-2 TO S2+2
2520 IF I<0 OR I>7 OR J<0 OR J>7 THEN PRINT "$"; : GOTO 2540
2530 PRINT MID$(S$,S(I,J),Z);
2540 PRINT " "; : NEXT : PRINT : NEXT : C9=Z : RETURN
FIGURE 6.5 FLOWCHART FOR SETTING UP CONTENTS OF A QUADRANT
: SET.UP.QUADRANT (3200)
CLEAR.ALL.SECTORS (3210)
RESET.SECTOR.SCANNED.FLAG
IS.QUADRANT.IN.GALAXY =)
YES (1) COMPUTE.UP.NUMBER.OF.KLINGONS (3230)
SET.UP.STARBASE.VALUE
COMPUTE.UP.NUMBER.OF.STARS (3240)
NO (1) CLEAR.STARBASE.COUNT
SET.UP.ZERO.KLINGONS
RANDOM.PROBABILITY.OF.SINGLE.STAR
THEN (1)
POSITION.ENTERPRISE (3250)
STARBASE.IN.QUADRANT =?
YES (2) POSITION.STARBASE (3260)
THEN (2)
LOOP (number of STARS) (3270)
+ POSITION.STAR
ENDLOOP
RESET.KLINGON.STATUS
KLINGONS.IN.QUADRANT =?
YES (3) LOOP (number of KLINGONS) (3300)
+ POSITION.KLINGON
LOOPEND
DISPLAY.RED.ALERT.MESSAGE
SHIELDS.DOWN =?
YES (4) DISPLAY.MESSAGE
THEN (4)
THEN (3) ; (3340)
FIGURE 6.6 BASIC LANGUAGE VERSION OF THE SUBROUTINE FOR SETTING UP A QUADRANT
3200 REM SUBROUTINE TO SET UP QUADRANT
3210 FOR I=0 TO 7 : FOR J=0 TO 7 : S(I,J)=Z : NEXT J : NEXT I : S9=0
3220 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN K=0 : B=0 : S=INT(RND(Z)*1.2) : GOTO 3250
3230 N=ABS(Q(Q1,Q2)) : K=INT(N/100) : N=N-K*100 : B=INT(N/10)
3240 S=ABS(Q(Q1,Q2))-(K*100+B*10)
3250 GOSUB 50 : S1=X : S2=Y : S(X,Y)=3 : IF B=0 THEN 3270
3260 GOSUB 50 : IF S(X,Y)<>Z THEN 3260 ELSE S(X,Y)=5
3270 FOR I=1 TO S : GOSUB 50 : IF S(X,Y)<>Z THEN 3280 ELSE S(X,Y)=2
3290 NEXT : FOR I=0 TO 7 : K3(I)=0 : NEXT : IF K=0 THEN 3340
3300 FOR I=1 TO K
3310 GOSUB 50 : IF S(X,Y)<>Z THEN 3310 ELSE S(X,Y)=4
3320 K1(I)=X : K2(I)=Y : K3(I)=RND(Z)*1000 : NEXT : PRINT : FOR I=Z TO 3 : PRINT "RED ALERT "; : NEXT
3330 PRINT CHR$(7) : IF E1=0 THEN PRINT "YOU FORGOT TO RAISE YOUR SHIELDS"
3340 RETURN
FIGURE 6.7 FLOWCHART TO DETERMINE THE CONDITION OF THE ENTERPRISE
: TEST.AND.SET.CONDITION (3400)
ENTERPRISE.NEXT.TO.STARBASE =? (3430)
YES (1) CONDITION.DOCKED =? (3450)
YES (2) UPDATE.PARAMETERS
NO (2) KLINGONS.IN.QUADRANT =? (3460)
YES (3) 50%.PROBABILITY. =?
YES (4) <DOCK> (3470)
DISPLAY.DOCKED.MESSAGE
UPDATE.PARAMETERS
SET.CONDITION.DOCKED
THEN (4)
NO (3) <DOCK>
DISPLAY.DOCKED.MESSAGE
UPDATE.PARAMETERS
SET.CONDITION.DOCKED
THEN (3)
THEN (2)
NO (1) KLINGONS.IN.QUADRANT =? (3490)
YES (5) SET.CONDITION.RED
NO (5) SUBSYSTEM.DAMAGED =? (3500)
YES (6) SET.CONDITION.YELLOW
NO (6) ENERGY.LOW =?
YES (7) SET.CONDITION.YELLOW
NO (7) SET.CONDITION.GREEN (3530)
THEN (7)
THEN (6)
THEN (5)
THEN (1) ; (3540)
FIGURE 6.8 BASIC LANGUAGE VERSION OF SUBROUTINE TO SET UP THE CONDITION OF THE ENTERPRISE
3400 REM SUBROUTINE TO SET UP CONDITION
3410 FOR I=S1-Z TO S1+Z : FOR J=S2-Z TO S2+Z
3420 IF I<0 OR I>7 OR J<0 OR J>7 THEN 3440
3430 IF S(I,J)=5 THEN 3450
3440 NEXT J : NEXT I : GOTO 3490
3450 IF C$="DOCKED" THEN GOSUB 90 : GOSUB 3550 : GOTO 3540
3460 IF K>0 AND RND(Z)<.5 THEN 3490
3470 PRINT : PRINT D$(6);"LOWERED FOR DOCKING" : GOSUB 3550 : PRINT : PRINT "REPAIRS and REFUELLING completed"
3480 GOSUB 90 : T=T-.5 : C$="DOCKED": GOTO 3540
3490 IF K>0 THEN C$="RED" : GOTO 3540
3500 FOR I=0 TO C1-C2 : IF D(I)>0 THEN C$="YELLOW" : GOTO 3540
3510 NEXT : IF E=<E0/10 THEN C$="YELLOW" ELSE C$="GREEN"
3540 RETURN
FIGURE 7.1 FLOWCHART FOR THE ENDGAME SEQUENCE
: ENDGAME (9000)
FLAG.=.1 =? (9010)
YES (1) RESIGNATION.ENDING (9020)
NO (1) FLAG.=.2 =?
YES (2) DESTROYED.BY.KLINGON (9040)
NO (2) FLAG.=.3 =?
YES (3) ENTERPRISE.RAN.OUT.OF.ENERGY (9080)
NO (3) FLAG.=.4 =?
YES (4) ALLOTED.TIME.OVER (9130)
NO (4) PLAYER.WINS.GAME (9160)
THEN (4)
THEN (3)
THEN (2)
THEN (1)
DISPLAY.SCORE (9180)
NEW.GAME.DIALOG
NEW.GAME.DESIRED =?
YES (5) PROMPT.FOR.STANDBY (9220)
RESET.FLAGS.AND.VARIABLES
DISPLAY.MISSION.MESSAGE
PLAY.THE.GAME
NO (5) RETURN.TO.BASIC.COMMAND.LEVEL
THEN (5) ;
FIGURE 7.2 BASIC VERSION OF ENDGAME ROUTINE
9000 REM ENDGAME
9010 PRINT : ON F9 GOTO 9020,9040,9080,9130,9160
9020 REM F9=1 RESIGNATION ENDING
9030 GOTO 9180
9040 REM F9=2 CREAMED BY KLINGON
9050 PRINT "THE ENTERPRISE HAS BEEN DESTROYED "
9060 PRINT "You did not make such a good Captain, did you ? "
9070 GOTO 9180
9080 REM F9=3 RAN OUT OF ENERGY
9090 PRINT "The Enterprise has run out of energy." : PRINT
9100 PRINT "You have just condemed yourself and your crew to"
9110 PRINT "a horrible and un-necessary death."
9120 GOTO 9180
9130 REM F9=4 RAN OUT OF TIME
9140 PRINT "You did not complete your mission in time"
9150 GOTO 9180
9160 REM F9=5 PLAYER WON
9170 PRINT "CONGRATULATIONS you passed your test"
9180 PRINT : GOSUB 170 : INPUT "Do you want to play again (Yes/No) "; A$ : IF LEN(A$)=0 THEN 9180
9190 IF LEFT$(A$,Z)="N" THEN 9230
9200 IF LEFT$(A$,Z)<>"Y" THEN 9180
9210 REM START NEW GAME
9220 PRINT CHR$(26): PRINT : PRINT "WAIT FOR IT" : GOSUB 4660 : GOTO 30
9230 END
FIGURE 7.3 FLOWCHART FOR THE MOVE SUBROUTINE
: MOVE (NAVIGATION) (1300)
DETERMINE.COURSE.DIRECTION (1310)
DETERMINE.WARP.FACTOR (1320)
WARP.FACTOR.<.MINIMUM =?
NO (1) WARP.FACTOR.>.MAXIMUM =? (1330)
YES (2) DISPLAY.ERROR.MESSAGE
NO (2) WARPFACTOR.>.1 =? (1340)
YES (3) ENGINES.DAMAGED =? (1350)
YES (4) DISPLAY.DAMAGED.MESSAGE
DIALOG.FOR.NEW.LEGAL.WARP.FACTOR
THEN (4)
KLINGONS.IN.QUADRANT =? (1370)
YES (5) BACKFIRE
GAMEOVER.FLAG.=.0 =?
NO (6) MOVE.TO.NEW.SECTOR (1360)
INSIDE.SAME.QUADRANT =? (1400)
YES (7) SECTOR.OCCUPIED =? (1410)
YES (8) BACK.UP.ONE
COLLISION
THEN (8)
NO (7) MOVE.TO.NEW.QUADRANT (1500)
THEN (7)
TIME.FOR.RANDOM.EVENT =? (1570)
YES (6) PERFORM.RANDOM.EVENT
THEN (6)
USE.ENERGY (1720)
ENERGY.LEVEL.>0 =?
YES (7) REPAIR.AS.YOU.GO (1730)
SET.UP.CONDITION (1740)
THEN (7)
THEN (5)
THEN (4)
THEN (3)
THEN (2)
THEN (1) ; (1750)
FIGURE 7.4 FLOWCHART FOR THE COLLISION EVENT
: COLLISION (1410)
HIT.A.STAR =?
YES (1) DISPLAY.MESSAGE (1420)
FORTY.PERCENT.PROBABILITY =?
YES (2) STARBASE.IN.QUADRANT =?
YES (3) ENGINE.SHUT.DOWN
BACK.UP.ONE.SECTOR
NO (3) SPACE.WARP
THEN (3)
NO (2) ENGINE.SHUT.DOWN
BACK.UP.ONE.SECTOR
THEN (2)
NO (1) HIT.A.KLINGON =?
YES (4) DISPLAY.MESSAGE (1440)
BACK.UP.ONE.SECTOR
DAMAGE.SOMETHING
THEN (4)
(HIT.A.STARBASE)
BACK.UP.ONE.SECTOR (1450)
DISPLAY.MESSAGE
KLINGONS.IN.QUADRANT =?
YES (5) DISPLAY.MESSAGE (CLUMSY)
NO (5) DISPLAY.MESSAGE (TRACTOR BEAM)
THEN (5)
THEN (1) ; (1480)
FIGURE 7.5 FLOWCHART FOR THE MOVE.TO.NEW.QUADRANT
: MOVE.TO.NEW.QUADRANT (1490)
COMPUTE.QUADRANT.NUMBER (1500)
ADJUST ELAPSED.TIME
INSIDE.GALAXY =? (1510)
YES (1) WAS.ENTERPRISE.OUTSIDE.GALAXY =? (1530)
YES (2) DISPLAY.BOUNDARY.CROSSING.MESSAGE
DAMAGE.SOMETHING
SET.GALAXY.FLAG.=.INSIDE
THEN (2)
NO (1) (Outside)
WAS.ENTERPRISE.INSIDE.GALAXY =? (1550)
YES (3) DISPLAY.BOUNDARY.CROSSING.MESSAGE
DAMAGE.SOMETHING
SET.GALAXY.FLAG.=.OUTSIDE
THEN (3)
THEN (1)
SET.UP.CONTENTS.OF.QUADRANT ; (1570)
FIGURE 7.6 FLOWCHART FOR THE DAMAGE.SOMETHING.EVENT
: DAMAGE.SOMETHING (110)
SELECT.RANDOM.SHIP.SUB.SYSTEM (120)
SET.RANDOM.ESTIMATED.TIME.TO.REPAIR.(ETR)
SET.DAMAGE.STATUS
DISPLAY.SUB-SYSTEM.DAMAGED.MESSAGE ;
FIGURE 7.7 BASIC LANGUAGE VERSION OF SUBROUTINE TO MOVE THE ENTERPRISE PAGE #
1300 REM NAV/WARP ENGINES/NAVIGATION
1310 INPUT "DIRECTION PLEASE (1-9) ";C : IF C<1 OR C>9 THEN 1310
1320 INPUT "WARP FACTOR ";W : IF W=<0 THEN 1750
1330 IF W>8 THEN PRINT " SIR WE CANNA GO THAT FAST" : GOTO 1320
1340 IF D(0)=0 THEN 1360
1350 IF W>=Z THEN PRINT D$(I);"DAMAGED (maximum allowable=.9) " : GOTO 1320
1360 REM MOVE ON
1370 S(S1,S2)=Z : T1=T : IF K>0 AND W>=Z THEN GOSUB 600 : IF F9>0 THEN 1750
1380 Y1=S1+.5 : X1=S2+.5 : Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y)
1390 FOR I=0 TO INT(W*8) : T=T-.1 : Y1=Y1+Y : X1=X1+X : Y2=INT(Y1) : X2=INT(X1)
1400 IF X2<0 OR X2>7 OR Y2<0 OR Y2>7 THEN 1490
1410 ON S(Y2,X2) GOTO 1470,1420,1470,1440,1450
1420 PRINT "STAR DEAD AHEAD" : IF RND(Z)>.6 AND B=0 THEN 1640
1430 PRINT "EMERGENCY ENGINE SHUT DOWN" : D(0)=D(0)+.5 : GOSUB 1780 : GOTO 1720
1440 PRINT : PRINT "STAND BY FOR COLLISION WITH KLINGON" : GOSUB 1780 : GOSUB 110 : GOTO 1720
1450 GOSUB 1780 : PRINT : PRINT "MESSAGE FROM STARBASE" : IF K>0 THEN PRINT "CLUMSY" : GOTO 1720
1460 PRINT "ENTERPRISE CAUGHT IN TRACTOR BEAM BEFORE COLLISION" : GOTO 1720
1470 NEXT : S1=Y2 : S2=X2 : S(Y2,X2)=3 : GOTO 1580
1490 REM-OUT OF SECTOR
1500 Q1=INT(Q1+W*Y+(S1+.5)/8) : Q2=INT(Q2+W*X+(S2+.5)/8) : T=T-.6
1510 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN 1550
1520 REM INSIDE GALAXY
1530 IF G9=Z THEN GOSUB 1760 : G9=0
1540 GOTO 1570
1550 IF G9=0 THEN GOSUB 1760 : G9=Z
1570 GOSUB 3200
1580 I=INT(RND(Z)*100) : IF I=0 OR I>4 THEN 1720
1590 IF G9=Z THEN 1680
1600 PRINT : IF B>0 THEN 1720
1610 ON I GOTO 1620,1640,1670,1680
1620 PRINT CHR$(7);"KLINGON SPACE MINE " : H=RND(Z)*400 : GOSUB 130 : IF F9>0 THEN 1750
1630 PRINT "SHIELDS DOWN TO"; E1; " UNITS" : GOTO 1720
1640 PRINT "SPACE WARP DUE TO GRAVITATIONAL ANOMALY" : GOSUB 50 : Q1=INT(X-P) : Q2=INT(Y-P)
1650 G9=0 : IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN G9=Z
1660 PRINT "SENSORS SHOW WE SEEM TO HAVE MOVED TO QUADRANT"; Q1+Z;",";Q2+Z : GOSUB 3200 : GOTO 1740
1670 PRINT CHR$(7);"ION STORM " : GOSUB 110 : GOTO 1720
1680 REM SPOCK DOES HIS FIXING HERE
1690 GOSUB 50 : FOR I=X TO C1-C2 : IF D(I)>0 THEN 1710
1700 NEXT : FOR I=0 TO X : IF D(I)<=0 THEN NEXT : GOTO 1720
1710 D(I)=0 : PRINT " Mr. SPOCK FIXED the ";D$(I)
1720 E=E-((INT(W*8))^2)/2 : IF E<0 THEN F9=3 : GOTO 1750
1730 GOSUB 1800 : IF E1>E THEN E1=E
1740 GOSUB 3400
1750 RETURN
1760 PRINT "CROSSING BARRIER at GALACTIC BOUNDARY" : GOSUB 110 : RETURN
1780 REM SUBROUTINE TO BACK UP ONE SECTOR
1790 S1=INT(Y1-Y) : S2=INT(X1-X) : S(S1,S2)=3 : RETURN
1800 REM SUBROUTINE FOR REPAIRS AFTER TIME (T1-T)
1810 IF T<0 THEN F9=4 : GOTO 1870
1820 N=0 :FOR I=0 TO C1-C2 : IF D(I)=<0 THEN 1860
1830 D(I)=D(I)-(T1-T) : IF D(I)>0 THEN 1860
1840 IF N=0 THEN PRINT : PRINT "DAMAGE CONTROL REPORTING " : N=Z
1850 D(I)=0 : PRINT D$(I);"REPAIRED"
1860 NEXT
1870 RETURN
110 REM SUBROUTINE TO DAMAGE SOMETHING
120 Y=Z+RND(Z)*W : X=INT((C1-C2)*RND(Z)) : D(X)=Y+D(X) : PRINT D$(X); "DAMAGED" : RETURN
130 REM ENERGY HIT SUBROUTINE
140 E1=E1-H : E=E-H : IF E1=<0 THEN F9=2 : GOTO 160
150 IF H>E1/2 THEN PRINT "SHIELD OVERLOAD ....."; : GOSUB 110
160 RETURN
FIGURE 7.8 COMPASS (BEARING) DIRECTIONS
4 3 2
\ : /
\ : /
\ : /
\:/
5 -----+---- 1 (9)
/:\
/ : \
/ : \
/ : \
6 7 8
NOTE: Fractional directions are allowed and encouraged
FIGURE 7.9 FLOWCHART FOR ON BOARD REPAIRS
: REPAIR.AS.WE.GO
OUT.OF.TIME =?
YES (1) SET.END.OF.GAME.FLAG
NO (2) RESET.REPAIRED.SOMETHING.FLAG 1820
LOOP (Number of On-board systems)
+ SYSTEM.DAMAGED =?
+ YES (2) UPDATE.ETR
+ IS.IT.FIXED =?
+ YES (3) IS.IT.FIRST.ONE.THIS.TIME =?
+ YES (4) DISPLAY.DAMAGE.CONTR[.MESSAGE
+ SET.REPAIE[.SOMETHING.FLAG
+ THEN (4)
+ DISPLAY.FIXED.MESSAGE
+ THEN (4)
+ THEN (2)
LOOPEND
THEN (1) ;
1800 REM SUBROUTINE FOR REPAIRS AFTER TIME (T1-T)
1810 IF T<0 THEN F9=4 : GOTO 1870
1820 N=0 :FOR I=0 TO C1-C2 : IF D(I)=<0 THEN 1860
1830 D(I)=D(I)-(T1-T) : IF D(I)>0 THEN 1860
1840 IF N=0 THEN PRINT : PRINT "DAMAGE CONTROL REPORTING " : N=Z
1850 D(I)=0 : PRINT D$(I);"REPAIRED"
1860 NEXT
1870 RETURN
FIGURE 7.10 FLOWCHART TO DAMAGE SOMETHING
: DAMAGE.SOMETHING
SET.RANDOM[.TIME
SET.RANDOM.SUB.SYSTEM
ADD.TIME.TO.SUBSYSTEM.ETR
DISPLAY.WHICH.SYSTEM.WAS.DAMAGED ;
FIGURE 7.12 FLOWCHART FOR ENERGY HIT
ENERGYHIT
DEDUCT.HIT.FROM.ON.BOARD.ENERGY
DEDUCT.HIT.FROM.SHIELDS
SHIELDS.BEATEN.DOWN =?
YES (1) (ENTERPRISE.DESTROYED)
SET.END.OF.GAME.FLAG
NO (1) MASSIVE.HIT =?
YES (2) DISPLAY.OVERLOAD.MESSAGE
DAMAGE.SOMETHING
THEN (2)
THEN (1) ;
: PHOTON.TORPEDO (1000)
FIGURE 8.1 FLOWCHART FOR THE PHOTON TORPEDO SUBROUTINE PAGE 21
ARE.TUBES.DAMAGED (1010)
YES (1) DISPLAY.DAMAGED.MESSAGE
NO (1) ANY.LEFT =? (1020)
YES (2) DIALOG.TO.SET.DIRECTION (1030)
SET.MOVE.PARAMETERS (1040)
LOOP (TORPEDO.IN.SECTOR) (1050)
+ MOVE.TORPEDO.ONE.SECTOR
+ OUTSIDE.QUADRANT =? (1060)
+ YES (3) DISPLAY.MISSED.MESSAGE
+ NO (3) DISPLAY.TRACK (1070)
+ IS.SECTOR.OCCUPIED =?
+ YES (4) IS.IT.A.KLINGON =?
+ YES (5) DID.IT.DODGE.THE.TORPEDO =? (1100)
+ NO (5A) DELETE.IT.FROM.QUADRANT (1220)
+ UPDATE.GAME.STATUS.DISPLAY
+ DISPLAY.HIT.MESSAGE
+ THEN (5A)
+ NO (5) IS.IT.A.STAR
+ YES (6) WAS.TORPEDO.ABSORBED.BY.STAR =?
+ YES (6A) DISPLAY.ABSORBED.MESSAGE (1080)
+ NO (6A) DISPLAY.DEFLECTED.MESSAGE (1090)
+ CHANGE.COURSE.PARAMETERS
+ THEN (6A)
+ NO (6) IS.IT.A.STARBASE =?
+ YES (7) DESTROY.STARBASE (1150)
+ DISPLAY.MESSAGES
+ NO (7) (Must be the ENTERPRISE) (1190)
+ DISPLAY.EVASIVE.ACTION.MESSAGE
+ THEN (7)
+ THEN (6)
+ THEN (5)
+ THEN (4)
+ THEN (3)
LOOPEND (1200)
NO (2) DISPLAY.ALL.GONE.MESSAGE
THEN (2)
THEN (1) ;
FIGURE 8.2 BASIC LANGUAGE IMPLEMENTATION OF PHOTON TORPEDO SUBROUTINE PAGE 22
1000 REM TOR PHOTON TORPEDOES
1010 IF D(I) > 0 THEN PRINT "TUBES BLOCKED" : GOTO 1210
1020 IF P = 0 THEN PRINT "NO TORPEDOE's LEFT SIR !" : GOTO 1210
1030 INPUT "DIRECTION (1-9) ";C : IF C<1 OR C>9 THEN 1030
1040 Y1=S1+.5 : X1=S2+.5 : Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y) : PRINT "TRACK"
1050 P=P-Z : FOR J=0 TO E0 : Y1=Y1+Y : X1=X1+X : Y2=INT(Y1) : X2=INT(X1)
1060 IF X2<0 OR X2>7 OR Y2<0 OR Y2>7 THEN PRINT "MISSED" : GOTO 1210
1070 PRINT Y2+Z;",";X2+Z : ON S(Y2,X2) GOTO 1200,1080,1190,1100,1150
1080 PRINT "STAR "; : IF RND(Z)<.5 THEN PRINT "ABSORBED TORPEDO" : GOTO 1210
1090 PRINT "DEFLECTED TORPEDO" : Y=Z+RND(Z)*8*.785398 : X=COS(Y) : Y=-SIN(Y) : GOTO 1200
1100 IF RND(Z)>.9 THEN 1200
1110 PRINT " KLINGON DESTROYED"
1120 FOR I=0 TO 7 : IF Y2=K1(I) AND X2=K2(I) THEN 1140
1130 NEXT I : PRINT "SENSOR MALFUNCTION";CHR$(7)
1140 K3(I)=0 : GOSUB 1220 : GOTO 1180
1150 PRINT " STARBASE DESTROYED, WELL DONE" : B=B-Z : B9=B9-10 : K8=K9 : T9=T+Z
1160 IF Q(Q1,Q2)<0 THEN Q(Q1,Q2)=Q(Q1,Q2)+10 ELSE Q(Q1,Q2)=Q(Q1,Q2)-10
1170 IF B9=0 THEN PRINT : PRINT "THAT WAS YOUR LAST STARBASE"
1180 S(Y2,X2)=Z : GOTO 1210
1190 PRINT CHR$(7);"EVASIVE ACTION ....missed us"
1200 NEXT J
1210 RETURN
1220 REM SUBROUTINE TO CLEAR KLINGON FROM SIMULATION
1230 K=K-Z : K9=K9-100 : IF K9=0 THEN F9=5
1240 IF Q(Q1,Q2)<0 THEN Q(Q1,Q2)=Q(Q1,Q2)+100 ELSE Q(Q1,Q2)=Q(Q1,Q2)-100
1250 RETURN
FIGURE 8.3 FLOWCHART FOR THE PHASER FUNCTION PAGE 23
: PHASER.FIRE (800)
KLINGONS.IN.QUADRANT =? (810)
YES (1) PHASERS.WORKING =? (820)
YES (2) SHORT.RANGE.SENSORS.WORKING =? (830)
NO (3) DISPLAY.BEST.GUESS.MESSAGE
THEN (3)
ALLOCATE.ENERGY.TO.PHASER.CONTROL (840)
SUBTRACT.ENERGY.FROM.SHIPSPOWER (850)
LOOP (on Klingons in Quadrant) (860)
+ COMPUTE.HIT (880)
+ DECREMENT.ITS.SHIELD.POWER
+ DISPLAY.HIT.MESSAGE
+ SHIELD.DOWN =? (<=0)
+ YES (4) DELETE.IT.FROM.QUADRANT
+ UPDATE.GAME.STATUS
+ THEN (4) KLINGONS'S.SHIELD.LOW =?
+ YES (5) KLINGON.SURRENDERS =?
+ YES (6) DELETE.IT.FROM.QUADRANT
+ UPDATE.GAME.STATUS
+ BOARDING.PARTY.OPERATION
+ NO (6) KLINGON.SELFDESTRUCTS = ?
+ YES (7) DELETE.IT.FROM.QUADRANT
+ UPDATE.GAME.STATUS.DISPLAY
+ THEN (7)
+ THEN (6)
+ THEN (5)
+ THEN (4)
LOOPEND
NO (2) DISPLAY.NOT.WORKING.MESSAGE
THEN (2)
NO (1) DISPLAY.MESSAGE.THAT.NO.TARGETS.IN.SECTOR
THEN (1) ;
FIGURE 8.4 BASIC LANGUAGE IMPLEMENTATION OF PHASER COMMAND
800 REM PHA PHASERS
810 IF K=0 THEN PRINT "No targets in quadrant ....... sir " : GOTO 950
820 IF D(I)>0 THEN PRINT D$(I);"OUT OF ACTION SIR" : GOTO 950
830 IF D(1)>0 THEN PRINT D$(1);"are not working, will use best guess settings"
840 INPUT "READY- how much energy do you want to fire "; X : IF X<=0 THEN 950
850 IF X>(E-E1) THEN PRINT "We don't have that much energy available sir" : GOTO 840
860 E = E - X : Y = K : FOR I = 0 TO 7 : IF K3(I)<=0 THEN 940
870 IF D(1)>0 THEN X = X*RND(Z)
880 H = X/(Y*(SQR((K1(I)-S1)^2+(K2(I)-S2)^2)^.4)) : K3(I) = K3(I) - H
890 PRINT "Hit on KLINGON at";K1(I)+Z;",";K2(I)+Z; : IF D(1)=0 THEN PRINT "(";K3(I);"Units left)" ELSE PRINT
900 IF K3(I)<=0 THEN K3(I) = 0 : PRINT "KLINGON DESTROYED" : S(K1(I),K2(I)) = Z : GOSUB 1220 : GOTO 940
910 IF K>Z OR K3(I)>E1/100 OR RND(Z)>.4 THEN 940
920 K3(I)=0 : S(K1(I),K2(I))=Z : GOSUB 1220 : IF RND(Z)<.7 THEN PRINT "KLINGON EXPLODED" : K5=K5+Z : GOTO 940
930 PRINT "KLINGON SURRENDERS .....Boarding party away" : K4 = K4 + Z : T1 = T : T = T - .5 : GOSUB 1800
940 NEXT
950 RETURN
FIGURE 8.5 FLOWCHART FOR SHIELDS COMMAND
: SHIELDS (2700)
IS.ENTERPRISE.DOCKED =? (2710)
YES (1) DISPLAY.RULES.MESSAGE
NO (1) ARE.SHIELDS.DAMAGED =? (2720)
YES (2) DISPLAY.DAMAGED.MESSAGE
NO (2) DIALOG.TO.AND.ASSIGN.ENERGY.TO.SHIELDS (2740)
THEN (2)
THEN (1) ;
FIGURE 8.6 BASIC LANGUAGE IMPLEMENTATION OF SHIELDS COMMAND
2700 REM SHE SHIELDS
2710 IF C$="DOCKED" THEN PRINT "Regulations forbid raising the shields when docked" : GOTO 2770
2720 IF D(I)>0 THEN PRINT D$(I)+"DAMAGED" : GOTO 2770
2730 PRINT D$(I);"currently at";E1;"Units"
2740 INPUT "How much energy to divert to the shields Sir ";N : IF N<0 THEN 2740
2750 IF N>E THEN PRINT "WE DON'T HAVE THAT MUCH SIR" : GOTO 2740
2760 E1=N
2770 RETURN
: SHOOTBACK (ROUTINE FOR KLINGONS SHOOTING BACK) (600)
IS.ENTERPRISE.DOCKED =? (610)
NO (1) LOOP (0 to 7) (620)
+ GAME.OVER.FLAG.SET =?
+ NO (2) KLINGON.ACTIVE =?
+ YES (3) HOSTILE.ACTION =?
+ YES (4) TORPEDO.FIRED =?
+ YES (5) TORPEDO.HIT =?
+ YES (6) DAMAGE.SOMETHING
+ NO (6) DISPLAY.MISS.MESSAGE
+ THEN (6)
+ NO (5) (PHASER) (640)
+ COMPUTE.ENERGY.FIRED
+ UPDATE.KLINGON.ENERGY.SUPPLY
+ COMPUTE.ENERGY.IN.HIT
+ UPDATE.ENTERPRISE.SHIELDS
+ SHIELDS.LESS.THAN.0 =?
+ YES (7) SET.GAME.OVER.FLAG
+ THEN (7)
+ MASSIVE.HIT =?
+ YES (8) DAMAGE.SOMETHING
+ THEN (8)
+ THEN (5)
+ THEN (4)
+ THEN (3)
+ THEN (2)
LOOPEND
SHIELDS.LOW =?
YES (6) DISPLAY.WARNING.MESSAGE
THEN (6)
THEN (1) ;
FIGURE 9.2 BASIC LANGUAGE VERSION OF SHOOTBACK FUNCTION
600 REM SHOOTBAK SUBROUTINE
610 IF C$="DOCKED" THEN 680
620 FOR I=0 TO 7 : IF K3(I)<=0 OR RND(Z)<.1*(I+Z) THEN 670
630 IF RND(Z)>K3(I)/500 THEN PRINT "KLINGON TORPEDO"; : H=RND(Z)*E1 : E1=E1+H : E=E+H : GOTO 660
640 H=K3(I)*.4*RND(Z) : K3(I)=K3(I)-H : H=H/(SQR((K1(I)-S1)^2+(K2(I)-S2)^2))^.4
650 PRINT H;"Unit hit on Enterprise";
660 PRINT " from sector";K1(I)+Z;",";K2(I)+Z : GOSUB 130 : IF F9>0 THEN 680
670 NEXT : IF E1<100 THEN PRINT D$(6);" Dangerously low";CHR$(7)
680 RETURN
FIGURE 9.3 ALTERNATE FORM OF THE SHOOTBACK SUBROUTINE
(600) REM SHOOTBAK SUBROUTINE
(610) IF C$="DOCKED" THEN 680
(620) FOR I=0 TO 7 : IF K3(I)<=0 OR RND(Z)<.1*(I+Z) THEN 670
(630) IF RND(Z)>K3(I)/500
PRINT "KLINGON TORPEDO"; : H=RND(Z)*E1 : E1=E1+H : E=E+H
ELSE (640) H=K3(I)*.4*RND(Z) : K3(I)=K3(I)-H : H=H/(SQR((K1(I)-S1)^2+(K2(I)-S2)^2))^.4
(650) PRINT H;"Unit hit on Enterprise";
THEN (660) PRINT " from sector";K1(I)+Z;",";K2(I)+Z
(130) REM ENERGY HIT SUBROUTINE
(140) E1=E1-H : E=E-H
IF E1=<0 THEN F9=2 : GOTO 160
(150) IF H>E1/2 THEN PRINT "SHIELD OVERLOAD ....."; : GOSUB 110
IF F9>0 THEN 680
ELSE
(670) NEXT :
THEN IF E1<100 THEN PRINT D$(6);" Dangerously low";CHR$(7)
(680) RETURN
FIGURE 9.4 FLOWCHART FOR MOVING KLINGONS AROUND
: MOVEKLINGON (700)
LOOP ( 7 times (number of possible KLINGONS in quadrant) )
+ KLINGON.ACTIVE =? (710)
+ YES (1) FIND.RANDOM.SECTOR (720)
+ SECTOR.EMPTY =?
+ YES (2) MOVE.KLINGON.INTO.IT (730)
+ THEN (2)
+ THEN (1)
LOOPEND ; (740)
FIGURE 9.5 BASIC LANGUAGE VERSION OF MOVE KLINGON FUNCTION
700 REM MOVE KLINGON ROUTINE
710 FOR I=0 TO 7 : IF K3(I)<=0 THEN 740
720 GOSUB 50 : IF S(X,Y)<>Z THEN 740
730 S(K1(I),K2(I))=Z : K1(I)=X : K2(I)=Y : S(X,Y)=4
740 NEXT : RETURN
FIGURE 9.6 FLOWCHART OF THE IMPLEMENTATION OF THE RESIGN COMMAND
: RESIGN (2600)
KLINGONS.IN.QUADRANT =? (2610)
YES (1) SURRENDER.NOT.ALLOWED
NO (1) REQUEST.CONFIRMATION (2620)
RESIGN.WANTED =?
YES (2) SET.END.OF.GAME.FLAG.TO.'RESIGN' (2640)
THEN (2)
THEN (1) ;
FIGURE 9.7 BASIC LANGUAGE IMPLEMENTATION OF RESIGN COMMAND
2600 REM RES RESIGN
2610 IF K>0 THEN PRINT : PRINT "YOUR SURRENDER WILL NOT BE ACCEPTED " : GOTO 2650
2620 INPUT "ARE YOU SURE (Yes/No) ";A$ : IF LEN(A$)=0 THEN 2620
2630 IF LEFT$(A$,Z)="N" THEN 2660
2640 IF LEFT$(A$,Z)="Y" THEN F9=Z
2650 GOTO 2620
2660 RETURN
FIGURE 9.8 TRANSPORTER FLOWCHART
IS.IT.DAMAGED =? (3600)
YES (1) PRINT.DAMAGED.MESSAGE
NO (1) ARE.SHORT.RANGE.SENSORS.DAMAGED =?
YES (2) DISPLAY.DAMAGED.MESSAGE
NO (2) IS.QUADRANT.SCANNED =? (3630)
YES (3) ARE.SHIELDS.UP =? (3640)
YES (4) DISPLAY.WARNING.MESSAGE
NO (4) ANY.KLINGONS.IN.QUADRANT (3650)
YES (5) DISPLAY.WARNING.MESSAGE
NO (5) DIALOG.TO.INPUT.DESTINATION.CO-ORDINATES (3660)
ARE.CO=ORDINATES.BLANK =?
YES (6) COMPUTE.ENERGY.REQUIRED.TO.TRANSPORT.THERE (3680)
IS.THE.ENERGY.AVAILABLE =?
YES (7) ADJUST.ENTERPRISE.ENERGY.LEVELS (3690)
NO (7) PRINT.WARNING
THEN (7)
NO (6) PRINT.THERE.IS.NOTHING.AT.THOSE.CO-ORDINATES
THEN (6)
THEN (5)
THEN (4)
NO (3) DISPLAY.MESSAGE.STATING.THAT.FACT